﻿//----------------------------------------------------------------
// Desc: INI文件读取
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2011-04-18
//
// Update Date : 
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
// 注意：注释符有两个，分别是“;”和“/”，单行的前面不能留空格。
//
// 使用方法：
//   IFINI* reader = FNewINI(FNEW_INFO);
//   if (reader->Open(_FT("config.ini")))
//   {
//       if (reader->OpenMuster(_FT("screen")))
//       {
//           bool win = reader->GetBool(_FT("window"));
//           int width = reader->GetInt(_FT("width"));
//           int height = reader->GetInt(_FT("height"));
//       }
//   }
//   FDel(reader);
//----------------------------------------------------------------
#pragma once


class IFINI : public IFMemObject
{
public:
    #pragma pack(push, 1)
    struct ITEM
    {
        const WCHAR* szKey;
        const WCHAR* szValue;
    };
    #pragma pack(pop)

protected:
    explicit IFINI()
    {}

public:
    // 打开INI文件
    FINLINE bool Open (const NCHAR* filename);
    virtual bool OpenW(const WCHAR* filename) = 0;
    virtual bool OpenA(const ACHAR* filename) = 0;
    // 关闭INI文件
    virtual void Close() = 0;
    // 取当前打开的文件路径名
    FINLINE const NCHAR* GetFilename ();
    virtual const WCHAR* GetFilenameW() = 0;
    virtual const ACHAR* GetFilenameA() = 0;
    // 打开指定集合
    // .name 该集合的名字
    // .return 是否包含此集合
    FINLINE bool OpenMuster (const NCHAR* name);
    virtual bool OpenMusterW(const WCHAR* name) = 0;
    virtual bool OpenMusterA(const ACHAR* name) = 0;
    // 打开指定集合
    // .index 该集合的索引
    // .return 是否包含此集合
    virtual bool OpenMuster(int index) = 0;
    // 取本INI文件中集合总数
    virtual size_t GetMusterCount() = 0;
    // 取当前打开的集合名
    FINLINE const NCHAR* GetCurMusterName ();
    virtual const WCHAR* GetCurMusterNameW() = 0;
    virtual const ACHAR* GetCurMusterNameA() = 0;
    // 测试当前集合下有没有某个健名
    // .name 键名
    // .return 该键数据地址，失败返回0
    FINLINE IFINI::ITEM* HasKey (const NCHAR* name);
    virtual IFINI::ITEM* HasKeyW(const WCHAR* name) = 0;
    virtual IFINI::ITEM* HasKeyA(const ACHAR* name) = 0;

    // 取当前集合下指定健名的健值
    // .name 键名
    FINLINE const NCHAR* GetString (const NCHAR* name);
    virtual const WCHAR* GetStringW(const WCHAR* name) = 0;
    virtual const ACHAR* GetStringA(const ACHAR* name) = 0;
    // 取当前集合下指定健名的健值
    // .name 键名
    FINLINE bool GetBool (const NCHAR* name);
    virtual bool GetBoolW(const WCHAR* name) = 0;
    FINLINE bool GetBoolA(const ACHAR* name);
    // 取当前集合下指定健名的健值
    // .name 键名
    FINLINE int GetInt (const NCHAR* name);
    virtual int GetIntW(const WCHAR* name) = 0;
    FINLINE int GetIntA(const ACHAR* name);
    // 取当前集合下指定健名的健值
    // .name 键名
    FINLINE float GetFloat (const NCHAR* name);
    virtual float GetFloatW(const WCHAR* name) = 0;
    FINLINE float GetFloatA(const ACHAR* name);
    // 取当前集合下指定健名的健值
    // .name 键名
    // .return 颜色类型键值，默认0xFFFFFFFF
    FINLINE DWORD GetColor (const NCHAR* name);
    virtual DWORD GetColorW(const WCHAR* name) = 0;
    FINLINE DWORD GetColorA(const ACHAR* name);
    // 取当前集合下指定健名的健值
    // .name 键名
    // .return POINT型键值
    FINLINE POINT GetPoint (const NCHAR* name);
    virtual POINT GetPointW(const WCHAR* name) = 0;
    FINLINE POINT GetPointA(const ACHAR* name);
    // 取当前集合下指定健名的健值
    // .name 键名
    // .return RECT型键值
    FINLINE RECT GetRect (const NCHAR* name);
    virtual RECT GetRectW(const WCHAR* name) = 0;
    FINLINE RECT GetRectA(const ACHAR* name);
    // 取当前集合下指定健名的健值
    // .name 键名
    // .return FRect型键值
    FINLINE FRect GetFRect (const NCHAR* name);
    virtual FRect GetFRectW(const WCHAR* name) = 0;
    FINLINE FRect GetFRectA(const ACHAR* name);
    // 取当前集合下健的总数
    // .return 集合数量
    virtual size_t GetCurMusterItemCount() = 0;

    // 取当前集合下指定索引的健名
    // .index 键索引
    // .return 键名
    FINLINE const NCHAR* GetCurMusterItemName (int index);
    virtual const WCHAR* GetCurMusterItemNameW(int index) = 0;
    virtual const ACHAR* GetCurMusterItemNameA(int index) = 0;
    // 取当前集合下指定索引的健值
    // .index 键索引
    // .return 键值
    FINLINE const NCHAR* GetCurMusterItemValue (int index);
    virtual const WCHAR* GetCurMusterItemValueW(int index) = 0;
    virtual const ACHAR* GetCurMusterItemValueA(int index) = 0;
};

#include "Core/IFDoc_INI_inl.h"

extern FAPI IFINI* FNewINI(FNEW_FUNC_API);